#include "game.h"
#include "ui_game.h"
#include <QtDebug>
#include <mainwindow.h>
Game::Game(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Game)
{
    ui->setupUi(this);
    intCoord();
    flag = true;
}

Game::~Game()
{
    delete ui;
}
void Game::closeEvent(QCloseEvent *event){
    emit myexit();
}
void Game::paintEvent(QPaintEvent *)
{
  paint=new QPainter;
  paint->begin(this);//主窗口

  paint->setPen(QPen(Qt::black,2,Qt::SolidLine));//颜色，线号，实线
  paint->setPen(QPen(Qt::black,2,Qt::SolidLine));//颜色，线号，实线
    //画SIZE+1条横线
    for(int i=0;i<SIZE+1;i++)
      {
        paint->drawLine(x,y+WIDTH*i,x+WIDTH*(SIZE),y+WIDTH*i);//画线函数：x1,y1,x2,y2:画从(x1,y1)到(x2,y2)的线
      }
    //画SIZE+1条竖线
    for(int i=0;i<SIZE+1;i++)
      {
        paint->drawLine(x+WIDTH*i,y,x+WIDTH*i,y+WIDTH*(SIZE));
      }
    //将棋子遍历出来
     for(int i=0;i<20;i++){
            for(int j=0;j<20;j++){
                if(coord[i][j]==1){
                    paint->setBrush(QBrush(Qt::black,Qt::SolidPattern));//毛刷：颜色，实图案
                    paint->drawEllipse(i*40,j*40,WIDTH,WIDTH);//画椭圆：中心点X,Y,宽度，高度
                }else if(coord[i][j]==2){
                    paint->setBrush(QBrush(Qt::white,Qt::SolidPattern));//毛刷：颜色，实图案
                    paint->drawEllipse(i*40,j*40,WIDTH,WIDTH);//画椭圆：中心点X,Y,宽度，高度
                }else {

                }
            }
      }
     paint->end();

}

void Game::intCoord(){
    for(int i=0;i<20;i++){
        for(int j=0;j<20;j++){
         coord[i][j]=0;
        }
    }
}


void Game::mousePressEvent(QMouseEvent *e)
{
    //----QMouseEvent类提供的x()和y()可获取鼠标相对窗口的位置
        QString strx = QString :: number(e->x());
        QString stry = QString :: number(e->y());

        //---点击左键
        if (Qt ::LeftButton == e->button())
        {
            int a = strx.toInt();
            int b = stry.toInt();
            abscissa = a/40;
            ordinate = b/40;
            qDebug()<<abscissa<<","<<ordinate;
            if(coord[abscissa][ordinate]==0)
             {
                update();
                if(flag==true){
                    coord[abscissa][ordinate]=1;
                    bool winer = judge(1,abscissa,ordinate);
                    if(winer==true){
                      QString color = "黑棋";
                      goOn(color);
                      flag = false;
                    }
                }else{
                    coord[abscissa][ordinate]=2;
                    bool winer = judge(2,abscissa,ordinate);
                    if(winer==true){
                        QString color = "白棋";
                        goOn(color);
                    }
                }
                flag=!flag;
            }
        }

}
//继续还是退出
void Game::goOn(QString colora){
    QMessageBox messageBox(QMessageBox::NoIcon, "提示", colora+"胜利，是否继续？",
                               QMessageBox::Yes | QMessageBox::No); ;
        int result=messageBox.exec();
        switch (result)
        {
        case QMessageBox::Yes:
            intCoord();
            break;
        case QMessageBox::No:
            close();
            break;
        default:
            break;
        }
}

//胜负判断

bool Game::judge(int i, int abscissa, int ordinate){
    if(judgeVertical(i, abscissa, ordinate)==true){
        return true;
    }else if(judgeLevel(i,abscissa,ordinate)==true){
        return true;
    }else if(judgeLeftbias(i,abscissa,ordinate)==true){
        return true;
    }else if(judgeRightbias(i,abscissa,ordinate)==true){
        return true;
    }else{
        return false;
    }
}
//判断垂直
bool Game::judgeVertical(int i, int abscissa, int ordinate)
{
    //判断在垂直方向是否五连，将垂直方向分两次判断，分别记录每个方向相同棋子的个数。
    int count=1;//记录与i同色棋子的个数
    for(int c=1;c<=5;c++){
        if(coord[abscissa-c][ordinate]==i){
        count++;
    }else
        break;
    }
    if(count>=5){
        return true;
    }
    for(int c=1;c<=5;c++){
        if(coord[abscissa+c][ordinate]==i){
        count++;
    }else
        break;
    }
    if(count>=5){
        return true;
    }else{
        return false;
    }
}
//水平
bool Game::judgeLevel(int i, int abscissa, int ordinate){
    //判断在水平方向是否五连，将水平方向分两次判断，分别记录每个方向相同棋子的个数。
    int count=1;//记录与i同色棋子的个数
    for(int c=1;c<=5;c++){
        if(coord[abscissa][ordinate-c]==i){
        count++;
    }else
        break;
    }
    if(count>=5){
        return true;
    }
    for(int c=1;c<=5;c++){
        if(coord[abscissa][ordinate+c]==i){
        count++;
    }else
        break;
    }
    if(count>=5){
        return true;
    }else{
        return false;
    }
}
//右斜方向
bool Game::judgeRightbias(int i, int abscissa, int ordinate){
    int count=1;//记录与i同色棋子的个数
    for(int c=1;c<=5;c++){
        if(coord[abscissa+c][ordinate-c]==i){
        count++;
    }else
        break;
    }
    if(count>=5){
        return true;
    }
    for(int c=1;c<=5;c++){
        if(coord[abscissa-c][ordinate+c]==i){
        count++;
    }else
        break;
    }
    if(count>=5){
        return true;
    }else{
        return false;
    }
}
//左斜方向
bool Game::judgeLeftbias(int i, int abscissa, int ordinate){
    int count=1;//记录与i同色棋子的个数
    for(int c=1;c<=5;c++){
        if(coord[abscissa-c][ordinate-c]==i){
        count++;
    }else
        break;
    }
    if(count>=5){
        return true;
    }
    for(int c=1;c<=5;c++){
        if(coord[abscissa+c][ordinate+c]==i){
        count++;
    }else
        break;
    }
    if(count>=5){
        return true;
    }else{
        return false;
    }
}
